#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#include <stack>
#include <bitset>
#define F first
#define S second
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=1010;
struct node
{
	int e[4];
}a[N*N];
int b[N][N];
vector<int> v;
int m;
int f[4];
int st[4];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int flag;
void solve()
{
    b[1][1]=v[f[0]];
    b[1][m]=v[f[1]];
    b[m][1]=v[f[2]];
    b[m][m]=v[f[3]];
    for(int i=1;i<=m;i++)
    {
    	for(int j=1;j<=m;j++)
		{
    		for(int k=0;k<4;k++)
    		{
    			int x=i+dx[k];
    			int y=j+dy[k];
    			if(b[x][y]==0 || a[b[i][j]].e[k]==b[x][y])
    			{
    				b[x][y]=a[b[i][j]].e[k];
				}
				else
				{
					memset(b,0,sizeof(b));
					return ;
				}
			}
		}
	}
	flag=1;
	return ;
}
void dfs(int x)
{
	if(flag) return ;
	if(x==4)
	{
		solve();
		return ;
	}
	for(int i=0;i<4;i++)
	{
		if(st[i]==0)
		{
			st[i]=1;
			f[x]=i;
			dfs(x+1);
			st[i]=0; 
		}
	}
}

int main()
{
	IOS;
	cin>>m;
	
	for(int i=1;i<=m*m;i++)
	{
		int cnt=0;
		for(int j=0;j<4;j++)
		{
			cin>>a[i].e[j];
			if(a[i].e[j]==-1) cnt++;
		}
		if(cnt==2)
		{
			v.push_back(i);
		}
	}
	if(m==1)
	{
		cout<<1;
		return 0;
	}
	dfs(0);
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<m;j++)
		{
			cout<<b[i][j]<<' ';
		}
		cout<<b[i][m];
		if(i!=m)cout<<'\n';
	} 

	return 0;
}

